﻿using System;
using System.Collections.Generic;
using System.Linq;
using DiNinject.EfModel;
using DiNinject.Repository.Interfaces;

namespace DiNinject.Repository.Implementation
{
    public class AutoRespository : IAutoRespository
    {
        #region Intialize

        public AutoRespository(IModelContainer modelContainer)
        {
            if (modelContainer == null)
            {
                throw  new NullReferenceException("ModelContainer ist Null.");
            }

            _modelContainer = modelContainer;
        }

        private IModelContainer _modelContainer;
        #endregion

        #region Interface Impl.
        /// <summary>
        /// Alle Autos aus der DB zurückgeben
        /// </summary>
        public List<Auto> AllAutos()
        {
            return _modelContainer.EFModelContainer.AutoSet.ToList();
        }

        /// <summary>
        /// Das Auto mit der übergebenen Id laden.
        /// </summary>
        /// <param name="id">Id des Autos welches geladen werden soll</param>
        public Auto Load(int id)
        {
            return _modelContainer.EFModelContainer.AutoSet.FirstOrDefault(p => p.Id == id);
        }

        /// <summary>
        /// Erstellen oder Aktualisieren des übergebenen Autos
        /// </summary>
        /// <param name="auto">Das Auto welches aktualisiert oder angelegt werden soll</param>
        public Auto AddOrUpdateAuto(Auto auto)
        {
            //Auto existiert noch nicht, dann anlegen
            if (auto.Id == 0)
            {
                _modelContainer.EFModelContainer.AutoSet.Add(auto);
            }
            else
            {
                //Laden des Autos und dann die passenden Properties mappen.
                var dbAuto = Load(auto.Id);
                if (dbAuto != null)
                {
                    dbAuto.Marke = auto.Marke;
                    dbAuto.Nummernschild = auto.Nummernschild;
                }
            }

            _modelContainer.EFModelContainer.SaveChanges();
            return auto;
        }
        #endregion

    }
}
